package controllers

import (
	"crmObject/models"
	"crmObject/util"
	"encoding/json"
	"fmt"
	"github.com/astaxie/beego"
	"github.com/astaxie/beego/orm"
	"github.com/gomodule/redigo/redis"
	"strconv"
)

type ServiceController struct {
	beego.Controller
}

var service models.Services
var services []models.Services

//关键字查询

func (c *ServiceController) KeyWordSelectService() {
	// 在进入每个页面之前进行登录状态的判断
	if !IsUserLoggedIn() {
		c.Redirect("/login", 302) // 未登录则重定向到登录页面
	}
	err := json.Unmarshal(c.Ctx.Input.RequestBody, &service)
	if err != nil {
		fmt.Println(err)
		errCode := 504
		newError := util.NewError(errCode)
		c.Data["json"] = LoginResponse{Code: newError.Code, Message: newError.Message}
		c.ServeJSON()
		return
	}
	ServiceName := service.ServiceName
	ServiceStatus := service.ServiceStatus
	newOrm := orm.NewOrm()
	//TODO 没有查询到结果
	if ServiceName == "" && ServiceStatus == "" {
		fmt.Println(err)
		errCode := 505
		newError := util.NewError(errCode)
		c.Data["json"] = LoginResponse{Code: newError.Code, Message: newError.Message}
		c.ServeJSON()
		return
	} else if ServiceName != "" {
		if ServiceStatus != "" {
			//两个都存在
			_, err = newOrm.QueryTable(&service).Filter("service_name__contains", ServiceName).Filter("service_status__contains", ServiceStatus).RelatedSel().All(&services)
		} else {
			//服务名称搜索
			_, err = newOrm.QueryTable(&service).Filter("service_name__contains", ServiceName).RelatedSel().All(&services)
			if err != nil {
				fmt.Println(err)
				errCode := 500
				newError := util.NewError(errCode)
				c.Data["json"] = LoginResponse{Code: newError.Code, Message: newError.Message}
				c.ServeJSON()
				return
			}
		}
	} else {
		//服务名称为空,搜索状态
		_, err = newOrm.QueryTable(&service).Filter("service_status__contains", ServiceStatus).RelatedSel().All(&services)
	}
	//虚假数据
	pagination := util.NewPagination(4, 1, util.PAGESIZE)
	c.Data["page"] = pagination

	c.Data["services"] = services
	c.TplName = "servicetables.html"
	//这里可以直接返回已经渲染好的页面的代码给ajax的data
}

//展示服务数据列表

func (c *ServiceController) ListService() {
	// 在进入每个页面之前进行登录状态的判断
	if !IsUserLoggedIn() {
		c.Redirect("/login", 302) // 未登录则重定向到登录页面
	}
	//当前页
	pageNoStr := c.GetString("pageNo")
	if pageNoStr == "" {
		//参数为空,错误处理
		//errCode := 505
		//newError := util.NewError(errCode)
		//c.Data["error"] = newError
		//c.TplName = "error.html"
		pageNoStr = "1"
	}
	pageNo, err := strconv.Atoi(pageNoStr)
	newOrm := orm.NewOrm()
	//总记录数
	totalPageCount, err := newOrm.QueryTable(&service).Count()
	if err != nil {
		fmt.Println(err)
		errCode := 500
		newError := util.NewError(errCode)
		c.Data["error"] = newError
		c.TplName = "error.html"
	}
	pagination := util.NewPagination(int(totalPageCount), pageNo, util.PAGESIZE)

	_, err = newOrm.QueryTable(&service).RelatedSel().Limit(util.PAGESIZE, (pageNo-1)*util.PAGESIZE).All(&services)
	if err != nil {
		fmt.Println(err)
		errCode := 500
		newError := util.NewError(errCode)
		c.Data["error"] = newError
		c.TplName = "error.html"
	}
	c.Data["services"] = services
	c.Data["page"] = pagination
	conn := util.RedisPool.Get()
	// 从 Redis 中读取 JSON 字符串
	userJSON, err := redis.String(conn.Do("GET", util.USERS))
	if err != nil {
		fmt.Println(err)
	}
	// 将 JSON 字符串反序列化为结构体
	err = json.Unmarshal([]byte(userJSON), &user)

	c.Data["user"] = user
	defer conn.Close()
	c.TplName = "servicetables.html"
}

//添加服务类型

func (c *ServiceController) AddService() {
	// 在进入每个页面之前进行登录状态的判断
	if !IsUserLoggedIn() {
		c.Redirect("/login", 302) // 未登录则重定向到登录页面
	}
	err := json.Unmarshal(c.Ctx.Input.RequestBody, &service)
	if err != nil {
		fmt.Println(err)
		errCode := 504
		newError := util.NewError(errCode)
		c.Data["json"] = LoginResponse{Code: newError.Code, Message: newError.Message}
		c.ServeJSON()
		return
	}
	o := orm.NewOrm()
	service.ServiceID = 0
	_, err = o.Insert(&service)
	if err != nil {
		fmt.Println(err)
		errCode := 500
		newError := util.NewError(errCode)
		c.Data["json"] = LoginResponse{Code: newError.Code, Message: newError.Message}
		c.ServeJSON()
		return
	}
	errCode := 200
	newError := util.NewError(errCode)
	c.Data["json"] = LoginResponse{Code: newError.Code, Message: newError.Message}
	c.ServeJSON()
}

//查询单条要修改的数据

func (c *ServiceController) SelectUpdateService() {
	// 在进入每个页面之前进行登录状态的判断
	if !IsUserLoggedIn() {
		c.Redirect("/login", 302) // 未登录则重定向到登录页面
	}
	err := json.Unmarshal(c.Ctx.Input.RequestBody, &service)
	if err != nil {
		fmt.Println(err)
		errCode := 504
		newError := util.NewError(errCode)
		c.Data["json"] = LoginResponse{Code: newError.Code, Message: newError.Message}
		c.ServeJSON()
		return
	}
	newOrm := orm.NewOrm()
	err = newOrm.QueryTable(&service).Filter("service_i_d", service.ServiceID).RelatedSel().One(&service)
	if err != nil {
		fmt.Println(err)
		errCode := 500
		newError := util.NewError(errCode)
		c.Data["json"] = LoginResponse{Code: newError.Code, Message: newError.Message}
		c.ServeJSON()
		return
	}
	c.Data["json"] = map[string]interface{}{
		"ServiceName":     service.ServiceName,
		"ServiceStatus":   service.ServiceStatus,
		"ServiceDescribe": service.ServiceDescribe,
	}
	c.ServeJSON()
}

//服务删除

func (c *ServiceController) DeleteService() {
	// 在进入每个页面之前进行登录状态的判断
	if !IsUserLoggedIn() {
		c.Redirect("/login", 302) // 未登录则重定向到登录页面
	}
	err := json.Unmarshal(c.Ctx.Input.RequestBody, &service)
	if err != nil {
		fmt.Println(err)
		errCode := 504
		newError := util.NewError(errCode)
		c.Data["json"] = LoginResponse{Code: newError.Code, Message: newError.Message}
		c.ServeJSON()
		return
	}
	newOrm := orm.NewOrm()
	_, err = newOrm.Delete(&service)
	if err != nil {
		fmt.Println(err)
		errCode := 500
		newError := util.NewError(errCode)
		c.Data["json"] = LoginResponse{Code: newError.Code, Message: newError.Message}
		c.ServeJSON()
		return
	}
	errCode := 200
	newError := util.NewError(errCode)
	c.Data["json"] = LoginResponse{Code: newError.Code, Message: newError.Message}
	c.ServeJSON()
}

//修改服务(根据id修改服务信息)

func (c *ServiceController) UpdateService() {
	// 在进入每个页面之前进行登录状态的判断
	if !IsUserLoggedIn() {
		c.Redirect("/login", 302) // 未登录则重定向到登录页面
	}
	err := json.Unmarshal(c.Ctx.Input.RequestBody, &service)
	if err != nil {
		fmt.Println(err)
		errCode := 504
		newError := util.NewError(errCode)
		c.Data["json"] = LoginResponse{Code: newError.Code, Message: newError.Message}
		c.ServeJSON()
		return
	}
	newOrm := orm.NewOrm()
	_, err = newOrm.Update(&service, "service_name", "service_status", "service_describe")
	if err != nil {
		fmt.Println(err)
		errCode := 500
		newError := util.NewError(errCode)
		c.Data["json"] = LoginResponse{Code: newError.Code, Message: newError.Message}
		c.ServeJSON()
		return
	}
	errCode := 200
	newError := util.NewError(errCode)
	c.Data["json"] = LoginResponse{Code: newError.Code, Message: newError.Message}
	c.ServeJSON()
}
